home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 5
/
Apprentice-Release5.iso
/
Source Code
/
Add-Ons
/
MPW
/
MPW re2c 1.1
/
dfa.h
< prev
next >
Wrap
Text File
|
1995-09-08
|
3KB
|
155 lines
#ifndef _dfa_h
#define _dfa_h
// $Log: dfa.h,v $
//Revision 1.1 1994/04/08 15:27:59 peter
//Initial revision
//
#include <iostream.h>
#include "re.h"
extern void prtCh(ostream&, uchar);
extern void printSpan(ostream&, uint, uint);
class DFA;
class State;
class Action {
public:
State *state;
public:
Action(State*);
virtual void emit(ostream&) = 0;
};
class Match: public Action {
public:
Match(State*);
void emit(ostream&);
};
class Enter: public Action {
public:
uint label;
public:
Enter(State*, uint);
void emit(ostream&);
};
class Save: public Match {
public:
uint selector;
public:
Save(State*, uint);
void emit(ostream&);
};
class Move: public Action {
public:
Move(State*);
void emit(ostream&);
};
class Accept: public Action {
public:
uint nRules;
uint *saves;
State **rules;
public:
Accept(State*, uint, uint*, State**);
void emit(ostream&);
};
class Rule: public Action {
public:
RuleOp *rule;
public:
Rule(State*, RuleOp*);
void emit(ostream&);
};
class Span {
public:
uint ub;
State *to;
public:
uint show(ostream&, uint);
};
class Go {
public:
uint nSpans;
Span *span;
public:
void genGoto(ostream&, State*);
void genBase(ostream&, State*);
void genLinear(ostream&, State*);
void genBinary(ostream&, State*);
void genSwitch(ostream&, State*);
void compact();
void unmap(Go*, State*);
};
class State {
public:
uint label;
RuleOp *rule;
State *next;
State *link;
uint depth; // for finding SCCs
uint kCount;
Ins **kernel;
bool isBase:1;
Go go;
Action *action;
public:
State();
~State();
void emit(ostream&);
friend inline ostream& operator<<(ostream&, const State&);
friend inline ostream& operator<<(ostream&, const State*);
};
class DFA {
public:
uint lbChar;
uint ubChar;
uint nStates;
State *head, **tail;
State *toDo;
public:
DFA(Ins*, uint, uint, uint, Char*);
~DFA();
void addState(State**, State*);
State *findState(Ins**, uint);
void split(State*);
void findSCCs();
void emit(ostream&);
friend inline ostream& operator<<(ostream&, const DFA&);
friend inline ostream& operator<<(ostream&, const DFA*);
};
inline Action::Action(State *s) : state(s) {
s->action = this;
}
inline Match::Match(State *s) : Action(s)
{ }
inline Enter::Enter(State *s, uint l) : Action(s), label(l)
{ }
inline Save::Save(State *s, uint i) : Match(s), selector(i)
{ }
inline ostream& operator<<(ostream &o, const State *s)
{ return o << *s; }
inline ostream& operator<<(ostream &o, const DFA *dfa)
{ return o << *dfa; }
#endif